home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / PROGRAMM / LOGO / H282.ZIP / MSWLOGO.ZIP / EXAMPLES.ZIP / FSM < prev    next >
Encoding:
Text File  |  1991-09-23  |  7.4 KB  |  312 lines

  1. TO ACCEPT
  2. LOCAL "OLDPOS
  3. MAKE "OLDPOS CURSOR
  4. SETCURSOR [15 1]
  5. TYPE "ACCEPT
  6. SETCURSOR :OLDPOS
  7. END
  8.  
  9. TO ACCEPTPART :MACHINE
  10. OP LAST :MACHINE
  11. END
  12.  
  13. TO ARRANGE :MOVE
  14. LOCAL [FROM INPUT TO ARROW]
  15. MAKE "FROM FIRST :MOVE
  16. MAKE "INPUT FIRST BF :MOVE
  17. MAKE "TO LAST :MOVE
  18. MAKESTATE :FROM
  19. MAKESTATE :TO
  20. MAKE "ARROW WORD :FROM :INPUT
  21. IFELSE NAMEP :ARROW [ARRANGE.DUPLICATE :ARROW] [ARRANGE.UNSEEN :ARROW]
  22. END
  23.  
  24. TO ARRANGE.DUPLICATE :ARROW
  25. IF MEMBERP :TO THING :ARROW [STOP]
  26. MAKE "TROUBLE "TRUE
  27. MAKE :ARROW MERGE :TO THING :ARROW
  28. END
  29.  
  30. TO ARRANGE.UNSEEN :ARROW
  31. MAKE :FROM FPUT :INPUT THING :FROM
  32. TEMPMAKE :ARROW SINGLE :TO
  33. END
  34.  
  35. TO BLANK
  36. LOCAL "OLDPOS
  37. MAKE "OLDPOS CURSOR
  38. SETCURSOR [15 1]
  39. TYPE "|      |
  40. SETCURSOR :OLDPOS
  41. END
  42.  
  43. TO BUILD.STATE :STATE
  44. OP MAP [LINK :STATE ? (FIRST THING WORD :STATE ?)] THING :STATE
  45. END
  46.  
  47. TO DETERMINE :MACHINE
  48. LOCAL [NEWACCEPT ALLSTATES ALIASES TROUBLE TEMPNAMES NEWMOVES]
  49. MAKE "NEWACCEPT ACCEPTPART :MACHINE
  50. MAKE "ALLSTATES []
  51. MAKE "ALIASES []
  52. MAKE "TROUBLE "FALSE
  53. MAKE "TEMPNAMES []
  54. FOREACH MOVEPART :MACHINE [ARRANGE ?]
  55. IF NOT :TROUBLE [FOREACH :TEMPNAMES [ERN ?] OP :MACHINE]
  56. RESOLVE :ALLSTATES
  57. MAKE "NEWMOVES REBUILD :ALLSTATES
  58. FOREACH :TEMPNAMES [ERN ?]
  59. OP LINK (STARTPART :MACHINE) :NEWMOVES :NEWACCEPT
  60. END
  61.  
  62. TO FSM :MACHINE
  63. CT
  64. SETCURSOR [0 3]
  65. FSM1 FIRST :MACHINE FIRST :MACHINE FIRST BF :MACHINE LAST :MACHINE
  66. END
  67.  
  68. TO FSM1 :START :HERE :MOVES :ACCEPT
  69. IFELSE MEMBERP :HERE :ACCEPT [ACCEPT] [REJECT]
  70. FSM1 :START (FSMNEXT :START :HERE RC :MOVES) :MOVES :ACCEPT
  71. END
  72.  
  73. TO FSMNEXT :START :HERE :INPUT :MOVES
  74. BLANK
  75. TYPE :INPUT
  76. IF EQUALP :INPUT CHAR 13 [TYPE CHAR 10  OP :START]
  77. CATCH "ERROR [OP LAST FIND [FSMTEST :HERE :INPUT ?] :MOVES]
  78. OP -1
  79. END
  80.  
  81. TO FSMTEST :HERE :INPUT :MOVE
  82. OP AND (EQUALP :HERE FIRST :MOVE) (EQUALP :INPUT FIRST BF :MOVE)
  83. END
  84.  
  85. TO GAME :WHICH
  86. FSM THING WORD "MACH :WHICH
  87. END
  88.  
  89. TO GETALIAS :LIST
  90. CATCH "ERROR [OP FIRST FIND [EQUALP :LIST LAST ?] :ALIASES]
  91. OP []
  92. END
  93.  
  94. TO LINK :ONE :TWO :THREE
  95. OP (LIST :ONE :TWO :THREE)
  96. END
  97.  
  98. TO MACHINE :REGEXP
  99. LOCAL "NEXTSTATE
  100. MAKE "NEXTSTATE 0
  101. OP OPTIMIZE DETERMINE NONDET :REGEXP
  102. END
  103.  
  104. TO MAKESTATE :STATE
  105. IF MEMBERP :STATE :ALLSTATES [STOP]
  106. MAKE "ALLSTATES FPUT :STATE :ALLSTATES
  107. TEMPMAKE :STATE []
  108. END
  109.  
  110. TO MANY.MOVES :PARTMOVE :ACCEPT
  111. FOREACH :ACCEPT [NEWMOVES SINGLE FPUT ? :PARTMOVE]
  112. END
  113.  
  114. TO MAPND :EXPRS
  115. OP MAP [NONDET ?] :EXPRS
  116. END
  117.  
  118. TO MERGE :NEW :LIST
  119. IF EMPTYP :LIST [OP FPUT :NEW []]
  120. IF :NEW < FIRST :LIST [OP FPUT :NEW :LIST]
  121. OP FPUT FIRST :LIST MERGE :NEW BF :LIST
  122. END
  123.  
  124. TO MOVEPART :MACHINE
  125. OP FIRST BF :MACHINE
  126. END
  127.  
  128. TO NDCONCAT :EXPRS
  129. OP REDUCE "STRING MAPND :EXPRS
  130. END
  131.  
  132. TO NDLETTER :LETTER
  133. LOCAL [FROM TO]
  134. MAKE "FROM NEWSTATE
  135. MAKE "TO NEWSTATE
  136. OP LINK :FROM (SINGLE (LINK :FROM :LETTER :TO)) (SINGLE :TO)
  137. END
  138.  
  139. TO NDMANY :REGEXP
  140. OP NDMANY1 NONDET :REGEXP
  141. END
  142.  
  143. TO NDMANY1 :MACHINE
  144. LOCAL [START MOVES ACCEPT]
  145. MAKE "START STARTPART :MACHINE
  146. MAKE "MOVES MOVEPART :MACHINE
  147. MAKE "ACCEPT ACCEPTPART :MACHINE
  148. FOREACH :MOVES [IF EQUALP :START FIRST ? [MANY.MOVES BF ? :ACCEPT]]
  149. OP LINK :START :MOVES (FPUT :START :ACCEPT)
  150. END
  151.  
  152. TO NDOR :EXPRS
  153. OP UNION NEWSTATE MAPND :EXPRS
  154. END
  155.  
  156. TO NEWACCEPT :NEW
  157. IF NOT MEMBERP :NEW :ACCEPT [MAKE "ACCEPT SE :NEW :ACCEPT]
  158. END
  159.  
  160. TO NEWMOVES :NEW
  161. MAKE "MOVES SE :NEW :MOVES
  162. END
  163.  
  164. TO NEWSTATE
  165. MAKE "NEXTSTATE :NEXTSTATE+1
  166. OP :NEXTSTATE
  167. END
  168.  
  169. TO NONDET :REGEXP
  170. IF WORDP :REGEXP [OP NDLETTER :REGEXP]
  171. IF EQUALP FIRST :REGEXP "OR [OP NDOR BF :REGEXP]
  172. IF EQUALP FIRST :REGEXP "* [OP NDMANY LAST :REGEXP]
  173. OP NDCONCAT :REGEXP
  174. END
  175.  
  176. TO OPTIMIZE :MACHINE
  177. LOCAL [START MOVES ACCEPT GOODSTATES GOODMOVES OLDMOVES]
  178. MAKE "START STARTPART :MACHINE
  179. MAKE "MOVES MOVEPART :MACHINE
  180. MAKE "ACCEPT ACCEPTPART :MACHINE
  181. MAKE "GOODSTATES SINGLE STARTPART :MACHINE
  182. MAKE "GOODMOVES []
  183. DO.UNTIL [MAKE "OLDMOVES :GOODMOVES ~
  184.           MAKE "MOVES FILTER [OPTIMIZE2 ?] :MOVES] ~
  185.          [EQUALP :OLDMOVES :GOODMOVES]
  186. OP LINK :START :GOODMOVES (FILTER [MEMBERP ? :GOODSTATES] :ACCEPT)
  187. END
  188.  
  189. TO OPTIMIZE2 :MOVE
  190. IF NOT MEMBERP FIRST :MOVE :GOODSTATES [OP "TRUE]
  191. MAKE "GOODMOVES FPUT :MOVE :GOODMOVES
  192. IF NOT MEMBERP LAST :MOVE :GOODSTATES ~
  193.    [MAKE "GOODSTATES FPUT LAST :MOVE :GOODSTATES]
  194. OP "FALSE
  195. END
  196.  
  197. TO REBUILD :STATELIST
  198. OP MAP.SE [BUILD.STATE ?] :STATELIST
  199. END
  200.  
  201. TO REJECT
  202. LOCAL "OLDPOS
  203. MAKE "OLDPOS CURSOR
  204. SETCURSOR [15 1]
  205. TYPE "REJECT
  206. SETCURSOR :OLDPOS
  207. END
  208.  
  209. TO RESOLVE :STATES
  210. IF EMPTYP :STATES [STOP]
  211. LOCAL "STATE
  212. MAKE "STATE FIRST :STATES
  213. RESOLVE SE (BF :STATES) ~
  214.            (MAP.SE [RESOLVE.ARROW WORD :STATE ?] THING :STATE)
  215. END
  216.  
  217. TO RESOLVE.ARROW :ARROW
  218. LOCAL [DESTINATIONS ALIAS]
  219. MAKE "DESTINATIONS THING :ARROW
  220. IF EMPTYP BF :DESTINATIONS [OP []]
  221. MAKE "ALIAS GETALIAS :DESTINATIONS
  222. IF NOT EMPTYP :ALIAS [MAKE :ARROW SINGLE :ALIAS OP []]
  223. MAKE "ALIAS NEWSTATE
  224. MAKESTATE :ALIAS
  225. MAKE :ARROW SINGLE :ALIAS
  226. MAKE "ALIASES FPUT (LIST :ALIAS :DESTINATIONS) :ALIASES
  227. FOREACH :DESTINATIONS [SETUPALIAS ?]
  228. OP :ALIAS
  229. END
  230.  
  231. TO SETA.INPUT :STATE :INPUT
  232. FOREACH (THING WORD :STATE :INPUT) [ARRANGE LINK :ALIAS :INPUT ?]
  233. END
  234.  
  235. TO SETUPALIAS :STATE
  236. IF AND (MEMBERP :STATE :NEWACCEPT) (NOT MEMBERP :ALIAS :NEWACCEPT) ~
  237.    [MAKE "NEWACCEPT FPUT :ALIAS :NEWACCEPT]
  238. FOREACH THING :STATE [SETA.INPUT :STATE ?]
  239. END
  240.  
  241. TO SINGLE :THING
  242. OP (LIST :THING)
  243. END
  244.  
  245. TO STARTPART :MACHINE
  246. OP FIRST :MACHINE
  247. END
  248.  
  249. TO STRING :MACHINE :OTHERS
  250. LOCAL [START MOVES ACCEPT OTHERSTART OTHERMOVES OTHERACCEPT]
  251. MAKE "START STARTPART :MACHINE
  252. MAKE "MOVES MOVEPART :MACHINE
  253. MAKE "ACCEPT ACCEPTPART :MACHINE
  254. MAKE "OTHERSTART STARTPART :OTHERS
  255. MAKE "OTHERMOVES MOVEPART :OTHERS
  256. MAKE "OTHERACCEPT ACCEPTPART :OTHERS
  257. OP LINK :START ~
  258.         (SE :MOVES ~
  259.             (STRING.SPLICE :ACCEPT :OTHERSTART :OTHERMOVES) ~
  260.             :OTHERMOVES) ~
  261.         (STRINGA :ACCEPT :OTHERSTART :OTHERACCEPT)
  262. END
  263.  
  264. TO STRING.COPY :ACCEPT :OTHERSTART :MOVE
  265. OP IFELSE EQUALP :OTHERSTART FIRST :MOVE [MAP [FPUT ? BF :MOVE] :ACCEPT] [[]]
  266. END
  267.  
  268. TO STRING.SPLICE :ACCEPT :OTHERSTART :OTHERMOVES
  269. OP MAP.SE [STRING.COPY :ACCEPT :OTHERSTART ?] :OTHERMOVES
  270. END
  271.  
  272. TO STRINGA :ACCEPT :OTHERSTART :OTHERACCEPT
  273. IF MEMBERP :OTHERSTART :OTHERACCEPT [OP SE :ACCEPT :OTHERACCEPT]
  274. OP :OTHERACCEPT
  275. END
  276.  
  277. TO TEMPMAKE :VAR :VAL
  278. MAKE "TEMPNAMES FPUT :VAR :TEMPNAMES
  279. MAKE :VAR :VAL
  280. END
  281.  
  282. TO UNION :START :MACHINES
  283. LOCAL [MOVES ACCEPT]
  284. MAKE "MOVES []
  285. MAKE "ACCEPT []
  286. FOREACH :MACHINES [UNION1 ?]
  287. OUTPUT LINK :START :MOVES :ACCEPT
  288. END
  289.  
  290. TO UNION1 :MACHINE
  291. NEWMOVES MOVEPART :MACHINE
  292. NEWMOVES MAP [FPUT :START BF ?] ~
  293.              FILTER [EQUALP (STARTPART :MACHINE) (FIRST ?)] MOVEPART :MACHINE
  294. NEWACCEPT ACCEPTPART :MACHINE
  295. IF MEMBERP (STARTPART :MACHINE) (ACCEPTPART :MACHINE) ~
  296.    [NEWACCEPT :START]
  297. END
  298.  
  299. MAKE "MACH1 [1 [[1 A 1] [1 B 1]] [1]]
  300. MAKE "MACH10 [1 [[1 A 1] [1 B 1] [1 C 2] [2 A 3] [2 B 1] [3 A 1]] [1]]
  301. MAKE "MACH2 [1 [[1 A 2] [1 B 2] [1 C 2] [2 A 1] [2 B 1] [2 C 1]] [1]]
  302. MAKE "MACH3 [1 [[1 A 2] [2 B 3] [3 A 3] [3 B 3] [3 C 3]] [3]]
  303. MAKE "MACH4 [1 [[1 A 2] [1 B 3] [1 C 4] [2 A 1] [3 B 1] [4 C 1]] [1]]
  304. MAKE "MACH5 [1 [[1 A 2] [1 B 2] [1 C 2] [2 B 1]] [1]]
  305. MAKE "MACH6 [1 [[1 A 2] [2 A 2] [2 B 2] [2 C 3] [3 A 2] [3 B 2] [3 C 3]] [3]]
  306. MAKE "MACH7 [1 [[1 A 1] [1 B 1] [1 C 2] [2 C 1]] [1]]
  307. MAKE "MACH8 [1 [[1 A 2] [1 B 1] [1 C 1] [2 A 1] [2 B 2] [2 C 2]] [1]]
  308. MAKE "MACH9 [1 [[1 A 2] [1 B 1] [1 C 1] [2 A 2] [2 B 3] [2 C 1] [3 A 2] ~
  309.                 [3 B 1] [3 C 4] [4 A 2] [4 B 5] [4 C 1] [5 A 6] [5 B 1] ~
  310.                 [5 C 1] [6 A 6] [6 B 6] [6 C 6]] ~
  311.              [6]]
  312.